# coding=utf-8
import time

print("✨新水仙花数计算器✨")
print("输入位数计算这个位数下所有的新水仙花数")
print("输入'0'开始计算，输入'1'查看何为新水仙花数。")

while True:
    choice = input("请输入：")
    if choice == "1":
        print(
            "\n新水仙花数：\n\t当一个自然数的每一位数的位数次方之和等于这个数本身,那么这个数就是新水仙花数。\n例如:371=3的三次方+7的三次方+1的三次方\n     1634=1的四次方+6的四次方+3的四次方+4的四次方\n"
        )
        break
    elif choice == "0":
        break

while True:
    j位数 = input("请输入位数：")
    if not j位数.isdigit():
        print("格式错误，请输入一个正整数。")
    elif j位数 == "0":
        break
    elif j位数 == "1":
        print("所有的一位数都是新水仙花数。\n")
    else:
        timeStart = time.time()

        j位数 = int(j位数)
        x新水仙花数 = []
        j新水仙花数个数 = 0

        # 预先计算0-9数字的次方值
        j次方值 = [i**j位数 for i in range(10)]

        # 计算各位之和达到输入位数的最小值
        for i in range(10):
            if j次方值[i] * j位数 >= 10 ** (j位数 - 1):
                j初始值 = i
                break

        # 通过加算平方和反向寻找水仙花数
        # 使数字间不同的排列顺序合并，只计算一次
        jl各位拆分 = [0] * j位数
        # 初始值
        jl各位拆分[0] = j初始值
        j累加位置 = 1
        # 从初始值加到全9
        while jl各位拆分[-1] != 9:
            if j累加位置 != j位数:
                j累加位置 += 1
            else:
                j累加位置 = jl各位拆分.index(jl各位拆分[-1]) + 1
                jl各位拆分[j累加位置:] = [0] * (j位数 - j累加位置)
                
            jl各位拆分[j累加位置 - 1] += 1
            # 算出各位拆分之和，并将计算出的和再次拆分，对比俩拆分数组是否拥有相同元素
            j总和 = sum(j次方值[j] for j in jl各位拆分)

            if j总和 >= 10 ** (j位数 - 1):
                jl总和拆分 = []
                temp = j总和
                while temp != 0:
                    jl总和拆分.append(temp % 10)
                    temp //= 10
                    
                j比较位置 = 0
                while jl总和拆分 != []:
                    if jl各位拆分[j比较位置] in jl总和拆分:
                        jl总和拆分.remove(jl各位拆分[j比较位置])
                        j比较位置 += 1
                    else:
                        break
                else:
                    x新水仙花数.append(j总和)
                    j新水仙花数个数 += 1

        timeEnd = time.time()

        print(f"输入的位数为{j位数}")
        print(f"新水仙花数为：{x新水仙花数}")
        print(f"一共有{j新水仙花数个数}个新水仙花数")
        print(f"用时{timeEnd-timeStart}")
        print("输入'0'退出\n")
